package process

import (
	"fmt"
	"go_chat_system/common"
	"go_chat_system/server/utils"
	"net"
)

// 总处理器
type Processor struct {
	Conn net.Conn
}

//创建安全的协程
func (this *Processor) CreateSafeGo(errCall func(err interface{})) {
	go func() {
		defer func(errCall func(err interface{})) {
			if err := recover(); err != nil {
				fmt.Printf("recover error: %v\n", err)
				if errCall != nil {
					errCall(err)
				}
			}
		}(errCall)

		this.ClientCommon()
	}()
}

// 接收客户端协程
func (this *Processor) ClientCommon() {
	defer this.Conn.Close()
	fmt.Println("成功连接上：", this.Conn.RemoteAddr().String())
	// 循环接收客户端的请求
	for {
		// 接收客户请求，并返回消息结构体
		transfer := &utils.Transfer{
			Conn: this.Conn,
		}
		mess, err := transfer.ReadData()
		// 客户端已退出
		if err != nil {
			if err.Error() == "ClientExit" {
				fmt.Printf("客户端[%s]已退出！\n", this.Conn.RemoteAddr().String())
				return
			} else {
				fmt.Println("Client Common Error:", err)
				break
			}
		}
		// 判断Message.Type类型，调用不同处理
		err = this.serverMessage(&mess)
	}
}

// 根据Message.Type调用不同的函数
func (this *Processor) serverMessage(mess *common.Message) (err error) {
	switch mess.Type {
	case common.Login: //登录请求
		// 不能共用一个实例，因为客户端不一定是同一个
		err = (&AccountProcess{
			Conn: this.Conn,
		}).Login(mess.Data) // 登录处理
	case common.Register: //注册请求
		err = (&AccountProcess{
			Conn: this.Conn,
		}).Register(mess.Data)
	case common.SmsMessageType:
		//fmt.Println("群聊内容：" + mess.Data)
		err = (&SmsProcess{}).SendGroupMessage(mess.Data)
	default:
		fmt.Println("!!![未知请求：", mess.Type, ", 未知数据：", mess.Data, "]!!!")
	}
	if err != nil {
		fmt.Println("[ERROR]错误提示：", err)
	}
	return
}
